home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d27 / bfrcmp.arc / BFRCMP.ASM next >
Assembly Source File  |  1990-06-03  |  2KB  |  76 lines

  1.     PAGE    ,132
  2.     TITLE    c Buffer Comparison
  3.  
  4. %    .MODEL    memmodel,C        ; will generate proper code for any model
  5.  
  6.     COMMENT    $
  7.  
  8. This function compares the contents of two buffers and returns the position
  9. where the first mismatch occurs in the buffer pair.  The buffers are examined
  10. on a byte-by-byte basis.  Nothing is destroyed except AX which contains 0 if
  11. nothing is different or the byte subscript of the difference.  Bytes are
  12. numbered from 1 to n (although c always numbers them from 0 to n-1) for this
  13. function's purpose.  If you need the offending byte in the c program array
  14. subtract 1 from the return value.  
  15.  
  16. This is a little tutorial piece on how to interface MASM 5.1 with C 5.1 because
  17. the manuals only consider that you need to know how to add two scaler values.
  18.  
  19. If you were familiar with coding in assembly language you would have almost no
  20. use for the manuals supplied by Microsoft.
  21.  
  22. use:
  23.     short (or int) bufcmp(ptr_string1, ptr_string2, nr_elements_to_compare)
  24.     returns:
  25.         0 - if all are equal
  26.         n - point at which they don't compare
  27.     note that if the array is not single bytes, you should do a multiply
  28.     of the number of elements to compare by the array element size and
  29.     use that value as the third argument.  Bfrcmp treats the first two
  30.     arguments as if they were char *ptr but will respect them as if they
  31.     were void *ptr.
  32.  
  33.     Programmed by A. L. Bender, M. D.
  34.  
  35.     This is in the public domain and may be freely used by anyone for any
  36.     purpose including the manufacture of derivative works.  In other words
  37.     it is freeware.  I'm not responsible for any damages that you might 
  38.     incur in its use and other comments from my fussypants lawyer.
  39.  
  40.  
  41. $    .TABSIZE    8    ; if TASM
  42.  
  43.     .CODE
  44. bfrcmp    PROC    USES SI DI CX ,arg1:PTR, arg2:PTR, arg3:WORD
  45.     IF    @DataSize
  46.     push    ds
  47.     push    es
  48.     ENDIF
  49.     pushf            ; save the flags
  50.     mov    cx,arg3        ; considered to be unsigned
  51.     test    cx,cx        ; test for zero length compare
  52.     jz    done        ; its ok to do that you know
  53.     IF    @DataSize    ; for other models
  54.     lds    si, arg1    ; large, chiefly
  55.     les    di, arg2
  56.     ELSE
  57.     mov    si, arg1    ; small, chiefly
  58.     mov    di, arg2
  59.     ENDIF
  60.     cld            ; forward
  61.     repe cmpsb        ; string compare, byte by byte
  62.     jnz    @F        ; it didn't match
  63. done:    xor    ax,ax        ; it did, or zero length compare
  64.     jmp    short exit    
  65. @@:    mov    ax, arg3    ; figure where it stopped
  66.     sub    ax, cx        ; will be off by one (desired)
  67. exit:    popf            ; restore them
  68.     IF    @DataSize
  69.     pop    es
  70.     pop    ds
  71.     ENDIF
  72.     ret            ; return to user code
  73. bfrcmp    ENDP
  74.     END
  75.  
  76.